适当减少手机使用,有助于视力保护... 新的一年祝您:身体健康,阖家欢乐!~~

python 函数之 exec() 的强大之处

浏览量:798 作者:admin 类别:: 学习笔记 更新时间:2022-07-07 14:03:29

之前,在程序编写过程中,有一个想法,那就是 传参,来跟据参数调用指定的方法。

当然,我们用 if 来判断是可以实现,但显然不是我想要的。


后来,也是通过其它方法实现的。


今天又想使用类似的方法。那就是在处理时间 datatime 时我又想试一下我的想法。


显然,我发现了,python 内置函数 exec()


这里,摘录一下,函数介绍


1、exec 语法exec(object[, globals[, locals]])

2、参数

object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。

globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。

locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。

3、返回值

永远为 None。


主要:就是要记住一点,这个函数,是把“代码字符串” 转成 可执行的代码,且没有返回值


示例:

# 我们正常输出一个字符串
print('hello')

# 如果,我们是通过,input 标签来输入一个代码,想让他执行了,那就这样

str_code = input("print('hello')")

# str_code 的类型没有疑问,是 <class 'str'>

# 我们让他执行了,就像下面这样

exec(str_code )

这样的效果就是等于 执行了 print('hello') 

以前在,某 php 程序中见过,好像java中也有。


# 比如我想动态提取时间的年月日,像下面这样

def dur(end,type,start='',str='%Y-%m-%d %H:%M:%S'):
    if start == '':
    start_time = datetime.now().strftime(str)
    fstr =  'print( datetime.strptime(end, str).' + type +')'
    
    exec(fstr)
    
    return False


这样就输出了,可以是year , month ....


但是 不是在里面使用return , SyntaxError: 'return' outside function

等进一步测试,object code

当然,如果需要返回值的话,我们也可以使用,eval


完整示例:


def dur(end, type, start='', f_str='%Y-%m-%d %H:%M:%S'):
    if start == '':
        start_time = datetime.now().strftime(f_str)

    fstr = '''datetime.strptime(end, f_str).{}'''.format(type)

    e_str = '''a = datetime.strptime('{}', '{}').{}'''.format(str(end), f_str, type)

    # exec(fstr) 无返回值 , 且不能直接使用外部的变量。 但可以使用globals() 来接受结果。
    # execute 执行的意思

    result={}

    # exec(fstr, globals(), result) # 结果 NameError: name 'end' is not defined

    # 发现第一个参数 是未定义的,就是使用不了传进来外部变量。

    exec(e_str, globals(), result)  # 这个就正常执行了。

    print(result)

    print(fstr)

    return eval(fstr)


print('exec_和_eval', dur("2030-01-01 10:00:00",'year'))

 



关于博主
北京南城网络及弱电【张工】为您提供:
校园网、楼宇、村镇、园区,光纤网络覆盖,无线覆盖 华为|H3c|锐捷|爱快|panabit等品牌,路由、交换机、AC、AP 无源光网络(PON)设备,布署、调试、维运,等服务...
应急/临时光纤熔接...[藤仓22S]
博文为学习python所写:内容摘自网络、学习笔记、记事备忘。
QQ:872876353,欢迎交流学习、加Q注明来意。

诗文鉴赏

《满江红》· 岳飞
落星侵晓没,
残月半山低。
怒发冲冠,
凭栏处、潇潇雨歇。
抬望眼、仰天长啸,壮怀激烈。
三十功名尘与土,八千里路云和月。
莫等闲、白了少年头,
空悲切。
源于生活-记录日常
The site based on python 3 with flask...